package com.huaxin.hxmoduleworkorder.common.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxmoduleworkorder.common.enums.base.BaseCodeEnum;

/*
 * ---------------------------------------------------------------------------------------------------------------------
 * 所有工单状态（MaintenanceOrderStatus）
状态码 (code)	中文描述	说明	                                    状态类型
created	        已创建	客户提交工单，处于草稿或待提交状态	        初始状态
reviewing	    审核中	客户提交后，等待管理员审核	                中间状态
assigned	    已分配	管理员已分配电工（但电工未接单）	            中间状态
reassign	    重新分配	因拒单或调整，需重新分配电工	                中间状态
processing	    处理中	至少一名电工已接单并开始处理（如到场、处理中）	中间状态
resolved	    已解决	所有电工任务已完成，问题已修复	            中间状态
evaluating	    待评价	客户需对服务进行评价	                    中间状态
completed	    已完成	客户完成评价，流程终结	                    终态
rejected	    已驳回	管理员审核不通过，退回给客户	                终态
cancelled	    已取消	客户或管理员取消工单	                    终态
* ----------------------------------------------------------------------------------------------------------------------
状态说明详解
created
    客户填写完工单但尚未提交。
    此时可编辑、删除。
    管理员不可见。
reviewing
    客户点击“提交”后进入此状态。
    管理员需审核内容是否完整、是否属于服务范围。
assigned
    管理员选择一名或多名电工进行分配。
    电工收到通知，可接单或拒单。
    若所有电工都拒单，应转为 reassign。
reassign
    表示需要重新分配电工（原分配失败）。
    管理员需重新指派。
    可避免直接回到 assigned 导致语义不清。
processing
    只要有一个电工任务状态为 accepted、on_site 或 processing，工单即为 processing。
    表示维修正在进行中。
resolved
    所有电工任务均已提交“已解决”。
    系统自动将工单置为此状态。
    触发客户评价流程。
evaluating
    客户需在规定时间内完成评价。
    可设置超时自动转为 completed。
completed
    流程终结状态。
    不可再修改、分配、评价。
    可用于统计、报表、归档。
rejected
    管理员审核不通过（如信息不全、非维保范围）。
    客户可编辑后重新提交。
cancelled
    客户主动取消（在 reviewing/assigned/processing 阶段）。
    或管理员因特殊原因取消。
    一旦进入 resolved 之后，通常不允许取消。
* ----------------------------------------------------------------------------------------------------------------------
状态分类（按生命周期）
类型	            状态
初始状态	        created
中间状态	        reviewing, assigned, reassign, processing, resolved, evaluating
终态（Terminal）	completed, rejected, cancelled
终态不可逆，一旦进入，不允许再变更为其他状态。

状态流转
[created] → submit → [reviewing]
                     ↘
                      → [rejected] ← admin_reject
                     ↗
[reviewing] → review_pass → [assigned]
                                ↘
                                 → [reassign] → reassign → [assigned]
                                ↗
[assigned] → any_electrician_accepted → [processing]
                                           ↓
                                      [resolved] → evaluate → [evaluating] → [completed]
                                           ↓
                                       [cancelled] ← cancel_by_customer_or_admin
 * ---------------------------------------------------------------------------------------------------------------------
 * 工单/任务的流程状态枚举
 */
public enum MaintenanceOrderStatus implements BaseCodeEnum {
    UNKNOWN("unknown", "未知", 0),
    CREATED("created", "已创建", 10),
    REVIEWING("reviewing", "审核中", 20),
    ASSIGNED("assigned", "已分配", 30),
    REASSIGNED("reassigned", "重新分配", 35),
    PROCESSING("processing", "处理中", 40),     // 至少一个电工在处理
    RESOLVED("resolved", "已解决", 50),         // 所有任务完成
    EVALUATING("evaluating", "待评价", 55),
    COMPLETED("completed", "已完成", 60),
    REJECTED("rejected", "已驳回", 70),
    CANCELLED("cancelled", "已取消", 80);

    @EnumValue
    private final String code;
    private final String displayName;
    private final int sort;

    MaintenanceOrderStatus(String code, String displayName, int sort) {
        this.code = code;
        this.displayName = displayName;
        this.sort = sort;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    public int getSort() {
        return sort;
    }

    public static MaintenanceOrderStatus of(String code) {
        if (code == null) return null;
        for (MaintenanceOrderStatus status : values()) {
            if (status.getCode().equalsIgnoreCase(code)) {
                return status;
            }
        }
        return null;
    }

    public static boolean isValid(String code) {
        return of(code) != null;
    }

    /**
     * 判断是否为终态（不可再变更的状态）
     */
    public boolean isTerminal() {
        return this == COMPLETED || this == REJECTED || this == CANCELLED;
    }

    // 提供静态方法获取所有终态的值
    public static String[] getTerminalCodes() {
        return new String[]{
                COMPLETED.getCode(),
                REJECTED.getCode(),
                CANCELLED.getCode()
        };
    }
}
